Priorbox ================= 根据输入的特征图尺寸、步长和预设的候选框配置,逐元素计算先验框(Prior Boxes),通常用于目标检测模型。 该算子遍历特征图的每一个网格中心点,并围绕该中心点生成一系列具有不同尺寸和宽高比的候选框。生成的坐标 ``[xmin, ymin, xmax, ymax]`` 经过归一化处理。 输入: - **fmap_h** - 当前特征图的高度。 - **fmap_w** - 当前特征图的宽度。 - **step_h** - 计算先验框在原图上坐标时的垂直缩放比例。 - **step_w** - 计算先验框在原图上坐标时的水平缩放比例。 - **offset** - 中心点偏移量,通常为0.5,表示取网格的正中心。 - **min_sizes** - 定义基础先验框尺寸的浮点数数组。 - **min_sizes_size** - ``min_sizes`` 数组的长度。 - **max_sizes** - 可选的浮点数数组,用于生成额外的正方形先验框。 - **max_sizes_size** - ``max_sizes`` 数组的长度。 - **different_aspect_ratios** - 定义不同宽高比的浮点数数组。 - **different_aspect_ratios_size** - ``different_aspect_ratios`` 数组的长度。 - **core_mask** - 核掩码 (仅共享存储版本需要)。 输出: - **output** - 用于存储最终生成的先验框坐标的数组。 - **output_size** - 指向一个整数的指针,函数执行后,该整数将记录写入 ``output`` 数组的浮点数总数。 支持平台: ``6678`` ``7004`` .. note:: - 6678支持fp32类型。 - 7004支持fp16和fp32类型。 **共享存储版本:** .. c:function:: int fp_priorbox_s(int fmap_h, int fmap_w, float step_h, float step_w, float offset, float *min_sizes, int min_sizes_size, float *max_sizes, int max_sizes_size, float *different_aspect_ratios, int different_aspect_ratios_size, float *output, int *output_size, int core_mask) .. c:function:: int hp_priorbox_s(int fmap_h, int fmap_w, half step_h, half step_w, half offset, half *min_sizes, int min_sizes_size, half *max_sizes, int max_sizes_size, half *different_aspect_ratios, int different_aspect_ratios_size, half *output, int *output_size, int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 22 #include "priorbox.h" int main() { // DDR memory pointers float *min_sizes = (float *)0xA0000000; float *max_sizes = (float *)0xA0001000; float *ratios = (float *)0xA0002000; float *output = (float *)0xB0000000; int output_size = 0; // Parameters int fmap_h = 19, fmap_w = 19; float step_h = 16.0f, step_w = 16.0f; float offset = 0.5f; int min_sizes_size = 1; int max_sizes_size = 1; int ratios_size = 2; int core_mask = 0xff; // (假设 min_sizes, max_sizes, ratios 已在DDR中填充数据) fp_priorbox_s(fmap_h, fmap_w, step_h, step_w, offset, min_sizes, min_sizes_size, max_sizes, max_sizes_size, ratios, ratios_size, output, &output_size, core_mask); return 0; } **私有存储版本:** .. c:function:: int fp_priorbox_p(int fmap_h, int fmap_w, float step_h, float step_w, float offset, float *min_sizes, int min_sizes_size, float *max_sizes, int max_sizes_size, float *different_aspect_ratios, int different_aspect_ratios_size, float *output, int *output_size) .. c:function:: int hp_priorbox_p(int fmap_h, int fmap_w, half step_h, half step_w, half offset, half *min_sizes, int min_sizes_size, half *max_sizes, int max_sizes_size, half *different_aspect_ratios, int different_aspect_ratios_size, half *output, int *output_size) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 16 #include "priorbox.h" int main() { // L2 memory arrays float min_sizes_data[] = {30.0f}; float max_sizes_data[] = {60.0f}; float ratios_data[] = {2.0f, 0.5f}; float output_data[4 * 19 * 19 * (1 + 1 + 2)]; // 足够大的空间 int output_size = 0; // Parameters int fmap_h = 19, fmap_w = 19; float step_h = 16.0f, step_w = 16.0f; float offset = 0.5f; fp_priorbox_p(fmap_h, fmap_w, step_h, step_w, offset, min_sizes_data, 1, max_sizes_data, 1, ratios_data, 2, output_data, &output_size); return 0; }